{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Reading Data with DLTK\n",
    "To build a reader you have to define a read function. This is a function with a signature `read_fn(file_references, mode, params=None)`, where \n",
    "- `file_references` is a array_like variable to be used to read files but can also be `None` if not used at all. \n",
    "- `mode` is a mode key from `tf.estimator.ModeKeys` and \n",
    "- `params` is a dictionary or `None` to pass additional parameters, you might need during interfacing with your inputs."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Creating a custom python generator `read_fn`\n",
    "In the following cell we define an example reader to read from the IXI dataset you can download with \n",
    "the included script. Let's start with some python, before we go into tensorflow:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import SimpleITK as sitk\n",
    "import os\n",
    "from dltk.io.augmentation import *\n",
    "from dltk.io.preprocessing import *\n",
    "import tensorflow as tf\n",
    "\n",
    "\n",
    "def read_fn(file_references, mode, params=None):\n",
    "    \n",
    "    # We define a `read_fn` and iterate through the `file_references`, which\n",
    "    # can contain information about the data to be read (e.g. a file path):\n",
    "    for meta_data in file_references:\n",
    "        \n",
    "        # Here, we parse the `subject_id` to construct a file path to read\n",
    "        # an image from.\n",
    "        subject_id = meta_data[0]\n",
    "        data_path = '../../data/IXI_HH/1mm'\n",
    "        t1_fn = os.path.join(data_path, '{}/T1_1mm.nii.gz'.format(subject_id))\n",
    "        \n",
    "        # Read the .nii image containing a brain volume with SimpleITK and get \n",
    "        # the numpy array:\n",
    "        sitk_t1 = sitk.ReadImage(t1_fn)\n",
    "        t1 = sitk.GetArrayFromImage(sitk_t1)\n",
    "\n",
    "        # Normalise the image to zero mean/unit std dev:\n",
    "        t1 = whitening(t1)\n",
    "        \n",
    "        # Create a 4D Tensor with a dummy dimension for channels\n",
    "        t1 = t1[..., np.newaxis]\n",
    "        \n",
    "        # If in PREDICT mode, yield the image (because there will be no label\n",
    "        # present). Additionally, yield the sitk.Image pointer (including all\n",
    "        # the header information) and some metadata (e.g. the subject id),\n",
    "        # to facilitate post-processing (e.g. reslicing) and saving.\n",
    "        # This can be useful when you want to use the same read function as \n",
    "        # python generator for deployment. Note: Data are not passed to\n",
    "        # tensorflow if we do not specify a data type for them \n",
    "        # (c.f. `dltk/io/abstract_reader`):\n",
    "        if mode == tf.estimator.ModeKeys.PREDICT:\n",
    "            yield {'features': {'x': t1},\n",
    "                   'metadata': {\n",
    "                       'subject_id': subject_id,\n",
    "                       'sitk': sitk_t1}}\n",
    "\n",
    "        # Labels: Here, we parse the class *sex* from the file_references \n",
    "        # \\in [1,2] and shift them to \\in [0,1] for training:\n",
    "        sex = np.int32(meta_data[1]) - 1\n",
    "        y = sex\n",
    "            \n",
    "        # If in TRAIN mode, we want to augment the data to generalise better\n",
    "        # and avoid overfitting to the training dataset:\n",
    "        if mode == tf.estimator.ModeKeys.TRAIN:\n",
    "            # Insert augmentation function here (see `dltk/io/augmentation`)\n",
    "            pass\n",
    "        \n",
    "        # If training should be done on image patches for improved mixing, \n",
    "        # memory limitations or class balancing, call a patch extractor \n",
    "        # (see `dltk/io/augmentation`):\n",
    "        if params['extract_examples']:\n",
    "            images = extract_random_example_array(\n",
    "                t1,\n",
    "                example_size=params['example_size'],\n",
    "                n_examples=params['n_examples'])\n",
    "            \n",
    "            # Loop the extracted image patches and yield\n",
    "            for e in range(params['n_examples']):\n",
    "                yield {'features': {'x': images[e].astype(np.float32)},\n",
    "                       'labels': {'y': y.astype(np.int32)},\n",
    "                       'metadata': {\n",
    "                           'subject_id': subject_id,\n",
    "                           'sitk': sitk_t1}}\n",
    "                     \n",
    "        # If desired (i.e. for evaluation, etc.), return the full images\n",
    "        else:\n",
    "            yield {'features': {'x': images},\n",
    "                   'labels': {'y': y.astype(np.int32)},\n",
    "                   'metadata': {\n",
    "                       'subject_id': subject_id,\n",
    "                       'sitk': sitk_t1}}\n",
    "\n",
    "    return"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `read_fn` above can be used as generator in python but we wrap it for you with our `Reader` class.\n",
    "For debugging, you can visualise the examples as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'features': {'x': array([[[[-0.7190699],\n",
      "         ..., \n",
      "         [-0.7190699]],\n",
      "\n",
      "        ..., \n",
      "        [[-0.7190699],\n",
      "         ..., \n",
      "         [-0.7190699]]],\n",
      "\n",
      "\n",
      "       ..., \n",
      "       [[[-0.7190699],\n",
      "         ..., \n",
      "         [-0.7190699]],\n",
      "\n",
      "        ..., \n",
      "        [[-0.7190699],\n",
      "         ..., \n",
      "         [-0.7190699]]]], dtype=float32)}, 'metadata': {'subject_id': 'IXI012', 'sitk': <SimpleITK.SimpleITK.Image; proxy of <Swig Object of type 'std::vector< itk::simple::Image >::value_type *' at 0x7f35503893c0> >}}\n"
     ]
    }
   ],
   "source": [
    "# Use pandas to read csvs that hold meta information to read the files from disk\n",
    "import pandas as pd\n",
    "import tensorflow as tf\n",
    "\n",
    "\n",
    "all_filenames = pd.read_csv(\n",
    "    '../../data/IXI_HH/demographic_HH.csv',\n",
    "    dtype=object,\n",
    "    keep_default_na=False,\n",
    "    na_values=[]).as_matrix()\n",
    "\n",
    "# Set up a some parameters as required in the `read_fn`:\n",
    "reader_params = {'n_examples': 1, \n",
    "                 'example_size': [128, 224, 224],\n",
    "                 'extract_examples': True}\n",
    "\n",
    "# Create a generator with the read file_references `all_filenames` and \n",
    "# `reader_params` in PREDICT mode:\n",
    "it = read_fn(file_references=all_filenames,\n",
    "             mode=tf.estimator.ModeKeys.PREDICT,\n",
    "             params=reader_params)\n",
    "\n",
    "# If you call `next`, the `read_fn` will yield an output dictionary as designed\n",
    "# by you:\n",
    "ex_dict = next(it)\n",
    "\n",
    "# Print that output dict to debug\n",
    "np.set_printoptions(edgeitems=1)\n",
    "print(ex_dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Using a custom `read_fn` with TensorFlow\n",
    "In order to use the `read_fn` in a tensorflow graph, we wrap the generator to feed a Tensorflow Dataset. You can generate this queue using `dltk/io/abstract_reader` or do it manually:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\njZbx/wMvvnonnLq+0wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f350c5dd810>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# As before, define the desired shapes of the examples and parameters to \n",
    "# pass to your `read_fn`:\n",
    "reader_example_shapes = {'features': {'x': reader_params['example_size'] + [1,]},\n",
    "                         'labels': {'y': []}}\n",
    "\n",
    "reader_params = {'n_examples': 1,\n",
    "                 'example_size': [128, 224, 224],\n",
    "                 'extract_examples': True}\n",
    "\n",
    "# If data_types are set for output dictionary entries, the `dltk/io/abstract_reader`\n",
    "# creates a tensorflow queue and enqueues the respective outputs for training.\n",
    "# Here, we would like to train our features and use labels as targets: \n",
    "reader_example_dtypes = {'features': {'x': tf.float32},\n",
    "                         'labels': {'y': tf.int32}}\n",
    "\n",
    "# Import and create a dltk reader\n",
    "from dltk.io.abstract_reader import Reader\n",
    "reader = Reader(read_fn=read_fn,\n",
    "                dtypes=reader_example_dtypes)\n",
    "\n",
    "# Now, get the input function and queue initialisation hook to use in a `tf.Session` or \n",
    "# with `tf.Estimator`. `shuffle_cache_size` defines the capacity of the queue.\n",
    "input_fn, qinit_hook = reader.get_inputs(all_filenames,\n",
    "                                         tf.estimator.ModeKeys.TRAIN,\n",
    "                                         example_shapes=reader_example_shapes,\n",
    "                                         batch_size=4,\n",
    "                                         shuffle_cache_size=10, \n",
    "                                         params=reader_params)\n",
    "\n",
    "# The input function splits the dictionary of `read_fn` into `features` and `labels` to\n",
    "# match the `tf.Estimator` input requirements. However, both are standard dictionaries.\n",
    "features, labels = input_fn()\n",
    "\n",
    "# Let's create a `tf.Session` and get a batch of features and corresponding labels:\n",
    "s = tf.train.MonitoredTrainingSession(hooks=[qinit_hook])\n",
    "batch_features, batch_labels = s.run([features, labels])\n",
    "\n",
    "# We can visualise the `batch_features` using matplotlib.\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.imshow(batch_features['x'][0, 0, :, :, 0], 'gray')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Additional information on `dltk.io.abstract_reader`:\n",
    "DLTK uses Tensorflow's queueing options to efficiently pass data to the computational graph. Our setup makes use of the [tf.data](https://www.tensorflow.org/api_docs/python/tf/data) API that enables us to use TFs wrappers with [tf.data.Dataset.from_generator](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator). We still wrap this function for better stack traces and to provide input functions suitable for [tf.Estimator](https://www.tensorflow.org/api_docs/python/tf/estimator)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on class Reader in module dltk.io.abstract_reader:\n",
      "\n",
      "class Reader(__builtin__.object)\n",
      " |  Wrapper for dataset generation given a read function\n",
      " |  \n",
      " |  Methods defined here:\n",
      " |  \n",
      " |  __init__(self, read_fn, dtypes)\n",
      " |      Constructs a Reader instance\n",
      " |      \n",
      " |      Args:\n",
      " |          read_fn: Input function returning features which is a dictionary of\n",
      " |              string feature name to `Tensor` or `SparseTensor`. If it\n",
      " |              returns a tuple, first item is extracted as features.\n",
      " |              Prediction continues until `input_fn` raises an end-of-input\n",
      " |              exception (`OutOfRangeError` or `StopIteration`).\n",
      " |          dtypes:  A nested structure of tf.DType objects corresponding to\n",
      " |              each component of an element yielded by generator.\n",
      " |  \n",
      " |  get_inputs(self, file_references, mode, example_shapes=None, shuffle_cache_size=100, batch_size=4, params=None)\n",
      " |      Function to provide the input_fn for a tf.Estimator.\n",
      " |      \n",
      " |      Args:\n",
      " |          file_references: An array like structure that holds the reference\n",
      " |              to the file to read. It can also be None if not needed.\n",
      " |          mode: A tf.estimator.ModeKeys. It is passed on to `read_fn` to\n",
      " |              trigger specific functions there.\n",
      " |          example_shapes (optional): A nested structure of lists or tuples\n",
      " |              corresponding to the shape of each component of an element\n",
      " |              yielded by generator.\n",
      " |          shuffle_cache_size (int, optional): An `int` determining the\n",
      " |              number of examples that are held in the shuffle queue.\n",
      " |          batch_size (int, optional): An `int` specifying the number of\n",
      " |              examples returned in a batch.\n",
      " |          params (dict, optional): A `dict` passed on to the `read_fn`.\n",
      " |      \n",
      " |      Returns:\n",
      " |          function: a handle to the `input_fn` to be passed the relevant\n",
      " |              tf estimator functions.\n",
      " |          tf.train.SessionRunHook: A hook to initialize the queue within\n",
      " |              the dataset.\n",
      " |  \n",
      " |  serving_input_receiver_fn(self, placeholder_shapes)\n",
      " |      Build the serving inputs.\n",
      " |      \n",
      " |      Args:\n",
      " |          placeholder_shapes: A nested structure of lists or tuples\n",
      " |              corresponding to the shape of each component of the feature\n",
      " |              elements yieled by the read_fn.\n",
      " |      \n",
      " |      Returns:\n",
      " |          function: A function to be passed to the tf.estimator.Estimator\n",
      " |          instance when exporting a saved model with estimator.export_savedmodel.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data descriptors defined here:\n",
      " |  \n",
      " |  __dict__\n",
      " |      dictionary for instance variables (if defined)\n",
      " |  \n",
      " |  __weakref__\n",
      " |      list of weak references to the object (if defined)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(Reader)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
